From: Kyrill Zorin Date: Mon, 11 Aug 2025 22:42:36 +0000 (+0100) Subject: extensionSystem: Fix extension enabling/disabling order X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~104^2^2~68 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=d3390d1afecbc7829b1618b99995f48eddb90f4a;p=gnome-shell.git extensionSystem: Fix extension enabling/disabling order Move disabling of unneeded extensions before enabling new ones in _onEnabledExtensionsChanged(). Previously, conflicting extensions could simultaneously be active briefly, leading to unclean states, memory leaks, freezes, or crashes. The old logic also caused unnecessary disable/enable cycles for newly requested extensions, wasting resources. Running the disable step first prevents these issues. Part-of: --- diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js index 06f7d967f..22121c4df 100644 --- a/js/ui/extensionSystem.js +++ b/js/ui/extensionSystem.js @@ -571,16 +571,6 @@ export class ExtensionManager extends Signals.EventEmitter { this.emit('extension-state-changed', extension); } - // Find and enable all the newly enabled extensions: UUIDs found in the - // new setting, but not in the old one. - const extensionsToEnable = newEnabledExtensions - .filter(uuid => !this._enabledExtensions.includes(uuid) && - this._extensionSupportsSessionMode(uuid)); - for (const uuid of extensionsToEnable) { - // eslint-disable-next-line no-await-in-loop - await this._callExtensionEnable(uuid); - } - // Find and disable all the newly disabled extensions: UUIDs found in the // old setting, but not in the new one. const extensionsToDisable = this._extensionOrder @@ -594,6 +584,16 @@ export class ExtensionManager extends Signals.EventEmitter { await this._callExtensionDisable(uuid); } + // Find and enable all the newly enabled extensions: UUIDs found in the + // new setting, but not in the old one. + const extensionsToEnable = newEnabledExtensions + .filter(uuid => !this._enabledExtensions.includes(uuid) && + this._extensionSupportsSessionMode(uuid)); + for (const uuid of extensionsToEnable) { + // eslint-disable-next-line no-await-in-loop + await this._callExtensionEnable(uuid); + } + this._enabledExtensions = newEnabledExtensions; }